home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Night Owl 6
/
Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso
/
029a
/
fcopyc10.zip
/
FARREAD.ASM
< prev
next >
Wrap
Assembly Source File
|
1992-01-05
|
10KB
|
181 lines
;-----------------------------------------------------------------------;
; FARREAD.ASM ;
; ;
; This module contains functions that duplicate the library functions ;
; _read() and _write(), except that these expect far pointers to the ;
; file buffer. Thus, when used with farmalloc(), the calling program ;
; can set up large file buffers using the far heap, regardless of the ;
; memory model being used. ;
; ;
; The len variable, indicating the buffer size, can be any int sized ;
; value up to (but not including) 65,535. 65,535 is also used to ;
; represent -1, which is used as the return value in case of error. ;
; It is recommended that the buffer be a multiple of the sector size ;
; (512 bytes in the current version of DOS), since reads and writes ;
; are more efficient if they involve whole sectors. A good value to ;
; use is 65024 (decimal), since this is 1 sector (512 bytes) short ;
; of a complete segment (64k). ;
;-----------------------------------------------------------------------;
; Usage: ;
; ;
; #include "fcopy.h" ;
; ;
; Function prototypes: ;
; ;
; int _farread (int handle, void far *buf, unsigned len) ;
; ;
; Returns the number of bytes read; ;
; on end-of-file, returns 0; ;
; on error returns -1 and sets both errno and _doserrno. ;
; ;
; int _farwrite (int handle, void far *buf, unsigned len) ;
; ;
; Returns the number of bytes written; ;
; on error returns -1 and sets both errno and _doserrno. ;
;-----------------------------------------------------------------------;
; Revision history: ;
; ;
; 1.0 5 JAN 92 Original. ;
; ;
; Uses conditional assembly for all ;
; memory models by defining _model. ;
; Defaults to the small model if ;
; _model is not defined. ;
; ;
; Uses TASM 2.0 extensions, so this ;
; source file will need modifications ;
; to assemble under MASM 5.1 or 6.0. ;
;-----------------------------------------------------------------------;
; Copyright (c) 1992 Ray Waters ;
; All Rights Reserved ;
;-----------------------------------------------------------------------;
IFNDEF _model ; if a _model directive was
.MODEL SMALL, C ; not defined, default to the
ELSE ; SMALL model
% .MODEL _model, C ; else, use the model indicated
ENDIF
EXTRN C errno:WORD ; global error variable
EXTRN C _doserrno:WORD ; global DOS error variable
.CODE ; open code segment
PUBLIC _farread ; make visible to Linker
;-----------------------------------------------------------------------;
; int _farread (int handle, void far *buf, unsigned len) ;
; ;
; Reads a file into a far buffer. ;
; ;
; Returns: If successful, returns number of bytes read. On ;
; end-of-file, returns 0. ;
; ;
; If read failed, returns -1 and sets errno and _doserrno ;
; to one of the following: ;
; ;
; EACCES Permission denied ;
; EBADF Bad file number ;
;-----------------------------------------------------------------------;
_farread PROC C
ARG handle:WORD, buf:FAR PTR BYTE, len:WORD
push ds ; save data segment
mov ah,3Fh ; DOS read file function
mov bx,[handle] ; file handle
mov cx,[len] ; number bytes to read
lds dx,[buf] ; far pointer to buffer
int 21h
pop ds ; restore data segment
jc @@read_error ; jump on error, else...
ret ; return to caller
@@read_error:
IF @DataSize EQ 2 ; if HUGE memory model,
push ds ; save DS
mov bx,SEG errno ; get segment address
mov ds,bx ; of errno into DS
ENDIF
mov [errno],ax ; set errno
mov [_doserrno],ax ; set _doserrno
mov ax,-1 ; return int value of -1
IF @DataSize EQ 2 ; if HUGE memory model,
pop ds ; restore DS
ENDIF
ret ; return to caller
_farread ENDP
PUBLIC _farwrite ; make visible to Linker
;-----------------------------------------------------------------------;
; int _farwrite (int handle, void far *buf, unsigned len) ;
; ;
; Writes to a file from a far buffer. ;
; ;
; Returns: If successful, returns number of bytes written. ;
; ;
; If write failed, returns -1 and sets errno amd _doserrno ;
; to one of the following: ;
; ;
; EACCES Permission denied ;
; EBADF Bad file number ;
; -1 Target disk full ;
;-----------------------------------------------------------------------;
_farwrite PROC C
ARG handle:WORD, buf:FAR PTR BYTE, len:WORD
push ds ; save data segment
mov ah,40h ; DOS write file function
mov bx,[handle] ; file handle
mov cx,[len] ; number bytes to write
lds dx,[buf] ; far pointer to buffer
int 21h
pop ds ; restore data segment
jc @@write_error ; jump on error
cmp ax,cx ; were all bytes written?
jne @@partial_write_error ; if not, partial write error
ret ; return to caller
@@partial_write_error:
IF @DataSize EQ 2 ; if HUGE memory model,
push ds ; save DS
mov bx,SEG errno ; get segment address
mov ds,bx ; of errno into DS
ENDIF
mov ax,-1 ; return int value of -1
mov [errno],ax ; set errno to -1
mov [_doserrno],ax ; set _doserrno to -1
IF @DataSize EQ 2 ; if HUGE memory model,
pop ds ; restore DS
ENDIF
ret ; return to caller
@@write_error: ; if write error,
IF @DataSize EQ 2 ; if HUGE memory model,
push ds ; save DS
mov bx,SEG errno ; get segment address
mov ds,bx ; of errno into DS
ENDIF
mov [errno],ax ; set errno
mov [_doserrno],ax ; set _doserrno
mov ax,-1 ; return int value of -1
IF @DataSize EQ 2 ; if HUGE memory model,
pop ds ; restore DS
ENDIF
ret ; return to caller
_farwrite ENDP
END